/**
 * 数据格式化工具函数
 */

// 数据大小单位枚举
export enum DataSizeUnit {
  B = 'B',
  KB = 'KB', 
  MB = 'MB',
  GB = 'GB',
  TB = 'TB',
  PB = 'PB'
}

// 单位转换倍数
const UNIT_MULTIPLIERS = {
  [DataSizeUnit.B]: 1,
  [DataSizeUnit.KB]: 1024,
  [DataSizeUnit.MB]: 1024 * 1024,
  [DataSizeUnit.GB]: 1024 * 1024 * 1024,
  [DataSizeUnit.TB]: 1024 * 1024 * 1024 * 1024,
  [DataSizeUnit.PB]: 1024 * 1024 * 1024 * 1024 * 1024
};

// 单位顺序（从小到大）
const UNIT_ORDER = [
  DataSizeUnit.B,
  DataSizeUnit.KB,
  DataSizeUnit.MB,
  DataSizeUnit.GB,
  DataSizeUnit.TB,
  DataSizeUnit.PB
];

/**
 * 自动调整数据大小单位，确保显示的数字在1-1024之间
 * @param sizeInBytes 原始字节数
 * @param decimalPlaces 小数点后位数，默认2位
 * @returns 格式化后的字符串，包含数值和单位
 */
export function formatDataSize(sizeInBytes: number, decimalPlaces: number = 2): string {
  if (sizeInBytes === 0) {
    return `0.00 ${DataSizeUnit.B}`;
  }

  // 找到合适的单位
  let unitIndex = 0;
  let size = sizeInBytes;

  // 向上调整单位，直到数字小于1024
  while (size >= 1024 && unitIndex < UNIT_ORDER.length - 1) {
    size = size / 1024;
    unitIndex++;
  }

  // 向下调整单位，直到数字大于等于1
  while (size < 1 && unitIndex > 0) {
    size = size * 1024;
    unitIndex--;
  }

  const unit = UNIT_ORDER[unitIndex];
  const formattedSize = Number(size.toFixed(decimalPlaces));

  return `${formattedSize} ${unit}`;
}

/**
 * 将指定单位的数据大小转换为字节
 * @param size 数据大小
 * @param unit 当前单位
 * @returns 字节数
 */
export function convertToBytes(size: number, unit: DataSizeUnit): number {
  return size * UNIT_MULTIPLIERS[unit];
}

/**
 * 将字节转换为指定单位
 * @param sizeInBytes 字节数
 * @param targetUnit 目标单位
 * @param decimalPlaces 小数点后位数，默认2位
 * @returns 转换后的数值
 */
export function convertFromBytes(sizeInBytes: number, targetUnit: DataSizeUnit, decimalPlaces: number = 2): number {
  const converted = sizeInBytes / UNIT_MULTIPLIERS[targetUnit];
  return Number(converted.toFixed(decimalPlaces));
}

/**
 * 智能格式化数据大小，返回数值和单位的对象
 * @param sizeInBytes 原始字节数
 * @param decimalPlaces 小数点后位数，默认2位
 * @returns 包含数值和单位的对象
 */
export function formatDataSizeObject(sizeInBytes: number, decimalPlaces: number = 2): { value: number; unit: DataSizeUnit } {
  if (sizeInBytes === 0) {
    return { value: 0, unit: DataSizeUnit.B };
  }

  // 找到合适的单位
  let unitIndex = 0;
  let size = sizeInBytes;

  // 向上调整单位，直到数字小于1000
  while (size >= 1000 && unitIndex < UNIT_ORDER.length - 1) {
    size = size / 1024;
    unitIndex++;
  }

  // 向下调整单位，直到数字大于等于1
  while (size < 1 && unitIndex > 0) {
    size = size * 1024;
    unitIndex--;
  }

  const unit = UNIT_ORDER[unitIndex];
  const value = Number(size.toFixed(decimalPlaces));

  return { value, unit };
}

/**
 * 格式化文件数量，支持千分位分隔符
 * @param count 文件数量
 * @returns 格式化后的字符串
 */
export function formatFileCount(count: number): string {
  // 处理 null、undefined 或非数字的情况
  if (count == null || isNaN(count)) {
    return '0';
  }
  return count.toLocaleString('zh-CN');
}

/**
 * 格式化百分比
 * @param value 数值
 * @param total 总数
 * @param decimalPlaces 小数点后位数，默认2位
 * @returns 格式化后的百分比字符串
 */
export function formatPercentage(value: number, total: number, decimalPlaces: number = 2): string {
  if (total === 0) return '0.00%';
  const percentage = (value / total) * 100;
  return `${percentage.toFixed(decimalPlaces)}%`;
} 